home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / sndadder / rec.c next >
Text File  |  1993-07-08  |  6KB  |  245 lines

  1. /*********************************
  2.  * 長時間サンプラー Version 1.00 *
  3.  * Copyright 1993 by Tetsuo O.   *
  4.  *********************************/
  5.  
  6. #pragma On(Align_labels) ;
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <cdrfrb.h>
  11. #include <string.h>
  12. #include <snd.h>
  13. #include <egb.h>
  14.  
  15. #define    UPPER_FREQ    19200
  16. extern    int snd_adder() ;
  17. extern    int ext_malloc() ;
  18.  
  19. struct STRING {
  20.     short x ;
  21.     short y ;
  22.     unsigned short len ;
  23.     char str[80] ;
  24. } ;
  25.  
  26. struct SAMPLING {
  27.     char name[8] ;
  28.     unsigned int id ;
  29.     unsigned int width ;
  30.     unsigned int loop_start ;
  31.     unsigned int loop_length ;
  32.     unsigned short freq ;
  33.     unsigned short fix ;
  34.     unsigned char onkai ;
  35.     unsigned char flug ;
  36.     unsigned short dummy ;
  37. } ;
  38.  
  39. int joy_wait(void)
  40. {
  41.     int stk ;
  42.  
  43.     do {
  44.         SND_joy_in_2(0,&stk) ;
  45.     } while(stk == 0xff) ;
  46.     return stk ;
  47. }
  48.  
  49. void main(argc,argv)
  50. int argc ;
  51. char *argv[] ;
  52. {
  53.     FILE *fp ;
  54.     char *ework,*swork,*buffer ;
  55.     char s_name[80],s2_name[80],para[10],chr[2] ;
  56.     int i,k,play_no,buff,cdtype,strack,etrack,freq,f1,f2 ;
  57.     struct TIMEADRS t_time[99],d_time,start,stop ;
  58.     struct SAMPLING    snd ;
  59.     char *w_name[2] ;
  60.  
  61.     w_name[0] = "recwork1" ;
  62.     w_name[1] = "recwork2" ;
  63.  
  64.     struct STRING msg[5] = {
  65.           0, 16, 54,"スーパーであることだよ、長時間サンプラーVer1.00",
  66.           0, 32, 17,"メモリの確保中だ。しばし待たれよ。",
  67.           0, 64, 54,"目的のCDを入れて、何かボタンを押せっていってんだよ!",
  68.           0, 96, 42,"正常終了でぇす。長い待ち時間御苦労様です!",
  69.           0,128, 56,"作成出来るファイルは、ディスク容量の半分までですからね。"
  70.      } ;
  71.  
  72.     struct STRING error[8] = {
  73.             0,447, 44,"TOWNSの構造上、こんなのはムぅリっスよ。",
  74.           0,431, 46,"データトラックはサンプリングできねぇよ・・・。",
  75.           0,447, 52,"出来るんなら、どうやんのか聞きてーもんだなぁ・・・。",
  76.           0,447, 48,"あのぉ、失礼ですけど、そんな番号の曲はないっス。",
  77.             0,447, 34,"ディスクの容量が足りないでゴワす。",
  78.           0,447, 60,"ディスクの容量が足りん! 残念賞でした。容量増やせよ。なぁ。",
  79.             0,447, 60,"原因不明のエラーなんですよ。困った困った。バグです。きっと。",                0,447, 36,"CDが正しくセットされてませんよぉ。"
  80.     } ;
  81.  
  82.     if (argc < 3 || argc > 4) {
  83.         printf("Usage : run386 REC [CD Number] [FileName] [freq]\n") ;
  84.         exit(9) ;
  85.     }
  86.     if ((ework = malloc(1536 + 16384)) == NULL) {
  87.         printf("メモリが不足しているザンス。") ;
  88.         printf("しかも、約16kBの不足ザマす。何に使ってるかは知らんけど、\n") ;
  89.         printf("普通の状態で立ち上げることをお勧めする。") ;
  90.         exit(9) ;
  91.     }
  92.     swork = ework + 1536 ;
  93.  
  94.     EGB_init(ework,1536) ;
  95.     EGB_resolution(ework,0,3) ;
  96.     EGB_writePage(ework,0) ;
  97.     EGB_displayStart(ework,3,640,480) ;
  98.     EGB_color(ework,0,7) ;
  99.     EGB_color(ework,1,0) ;
  100.     EGB_color(ework,2,0) ;
  101.     EGB_clearScreen(ework) ;
  102.     EGB_fontStyle(ework,1) ;
  103.     EGB_textZoom(ework,0,16,16) ;
  104.     EGB_textZoom(ework,1,16,16) ;
  105.     EGB_paintMode(ework,0x20) ;
  106.     SND_init(swork) ;
  107.     SND_elevol_init() ;
  108.     SND_elevol_all_mute(0) ;
  109.     SND_elevol_set(1,127,127) ;
  110.  
  111.     EGB_sjisString(ework,(char *)&msg[0]) ;
  112.     EGB_sjisString(ework,(char *)&msg[1]) ;
  113.     EGB_color(ework,0,3) ;
  114.     EGB_sjisString(ework,(char *)&msg[4]) ;
  115.     EGB_color(ework,0,7) ;
  116.  
  117.     i = ext_malloc(buffer) ;
  118.     if (argc != 4)
  119.         freq = UPPER_FREQ ;
  120.     else
  121.         if ((freq = atoi(argv[3])) > UPPER_FREQ) {
  122.             EGB_color(ework,0,2) ;
  123.             EGB_sjisString(ework,(char *)&error[0]) ;
  124.             joy_wait() ;
  125.             free(buffer) ;
  126.             exit(9) ;
  127.         }
  128.     
  129.     EGB_sjisString(ework,(char *)&msg[2]) ;
  130.     joy_wait() ;
  131.     WORD(para + 0) = 0 ;
  132.     WORD(para + 2) = 400 ;
  133.     WORD(para + 4) = 639 ;
  134.     WORD(para + 6) = 480 ;
  135.     EGB_rectangle(ework,para) ;
  136.     while(cdr_cdinfo(0,&cdtype,&strack,&etrack,&t_time[0],&d_time) & 0x80 != 0) {
  137.         EGB_color(ework,0,2) ;
  138.         EGB_sjisString(ework,(char *)&error[7]) ;
  139.         joy_wait() ;
  140.         EGB_rectangle(ework,para) ;
  141.     }
  142.  
  143.     EGB_color(ework,0,7) ;
  144.     play_no = atoi(argv[1]) ;
  145.     if (play_no == 1 && (cdtype == 2 || cdtype == 3)) {
  146.         EGB_color(ework,0,2) ;
  147.         EGB_sjisString(ework,(char *)&error[1]) ;
  148.         EGB_sjisString(ework,(char *)&error[2]) ;
  149.         joy_wait() ;
  150.         free(buffer) ;
  151.         SND_end() ;
  152.         exit(9) ;
  153.     }
  154.     if (play_no > etrack) {
  155.         EGB_color(ework,0,2) ;
  156.         EGB_sjisString(ework,(char *)&error[3]) ;
  157.         joy_wait() ;
  158.         free(buffer) ;
  159.         SND_end() ;
  160.         exit(9) ;
  161.     }
  162.     start = t_time[play_no-1] ;
  163.     stop = t_time[play_no] ;
  164.     stop.min &= 0x7f ;
  165.     if ((stop.frame--) == 0x00) {
  166.         stop.frame = 74 ;
  167.         if ((stop.sec--) == 0x00) {
  168.             stop.sec = 59 ;
  169.             stop.min-- ;
  170.         }
  171.     }
  172.     strcpy(&snd.name[0],argv[2]) ;
  173.  
  174.     snd.width = i ;
  175.     snd.loop_start = snd.loop_length = 0 ;
  176.     snd.flug = snd.dummy = 0 ;
  177.     snd.freq = freq * 0x62 ;
  178.     snd.fix = 0 ;
  179.     snd.onkai = (char)60 ;
  180.  
  181.     cdr_mtplay(0,&start,&stop) ;
  182.     buff = 0 ;
  183.     do {
  184.         SND_pcm_rec(freq,buffer,i,0) ;
  185.         cdr_pause(0) ;
  186.         strcpy(s_name,argv[2]) ;
  187.         chr[0] = (char)('0' + buff / 10) ;
  188.         chr[1] = (char)('0' + buff % 10) ;
  189.         strcat(s_name,chr) ;
  190.         strcat(s_name,".snd") ;
  191.         fp = fopen(s_name,"wb") ;
  192.         fwrite(&snd,sizeof(char),32,fp) ;
  193.         if (fwrite(buffer,sizeof(char),i,fp) < i) {
  194.             EGB_color(ework,0,2) ;
  195.             EGB_sjisString(ework,(char *)&error[4]) ;
  196.             joy_wait() ;
  197.             fclose(fp) ;    free(buffer) ;    SND_end() ;
  198.             exit(9) ;
  199.         }
  200.         fclose(fp) ;
  201.         ++buff ;
  202.     } while(cdr_continue(0) == 0) ;
  203.     free(buffer) ;
  204.  
  205.     strcpy(s_name,argv[2]) ;
  206.     strcpy(s2_name,s_name) ;
  207.     strcat(s_name,"00") ;
  208.     strcat(s2_name,"01") ;
  209.     if (snd_adder(s_name,s2_name,w_name[0]) == 0) {
  210.         strcat(s_name,".snd") ;    remove(s_name) ;
  211.         strcat(s2_name,".snd") ;    remove(s2_name) ;
  212.     } else {
  213.         EGB_color(ework,0,2) ;
  214.         EGB_sjisString(ework,(char *)&error[5]) ;
  215.         joy_wait() ;
  216.         SND_end() ;
  217.         exit(9) ;
  218.     }
  219.     for (i=2; i<buff-1; i++) {
  220.         strcpy(s_name,argv[2]) ;
  221.         chr[0] = (char)('0' + i / 10) ;
  222.         chr[1] = (char)('0' + i % 10) ;
  223.         strcat(s_name,chr) ;
  224.         f1 = i % 2 + 1 ;
  225.         f2 = 2 - (i % 2) ;
  226.         if ((k = snd_adder(w_name[f1],s_name,w_name[f2])) == 0) {
  227.             strcat(s_name,".snd") ;    remove(s_name) ;
  228.             strcpy(s_name,w_name[f1]) ;    strcat(s_name,".snd") ;remove(s_name) ;
  229.         } else {
  230.             EGB_color(ework,0,2) ;
  231.             if (k != 2)
  232.                 EGB_sjisString(ework,(char *)&error[6]) ;
  233.             else
  234.                 EGB_sjisString(ework,(char *)&error[5]) ;
  235.             joy_wait() ;
  236.             SND_end() ;
  237.             exit(9) ;
  238.         }    
  239.     }
  240.     EGB_sjisString(ework,(char *)&msg[3]) ;
  241.     joy_wait() ;
  242.     SND_end() ;
  243.     exit(0) ;
  244. }
  245.